/*******************************************************************************
 * Includes
 ******************************************************************************/
#include "Wed_kernel.h"

/*******************************************************************************
 * Static
 ******************************************************************************/
static uint8_t           __g_app_stack[WED_APP_STACK_SIZE];
static struct Wed_thread __g_app_thread;

/*******************************************************************************
 * Extern
 ******************************************************************************/
extern void Wed_app_main(void);

/*******************************************************************************
 * Code
 ******************************************************************************/
#if WED_KERNEL_FREERTOS
/**
 * \brief FreeRTOS 内存分配函数
 */
void *pvPortMalloc(size_t xWantedSize){
    return Wed_malloc(xWantedSize);
}

/**
 * \brief FreeRTOS 内存释放函数
 */
void vPortFree(void *pv){
    Wed_free(pv);
}
#endif

/**
 * \brief 内核初始化
 *
 * @return 成功返回 0
 */
int Wed_kernel_init(void){
#if WED_KERNEL_FREERTOS
#endif
    return 0;
}

/**
 * \brief 应用任务函数
 */
static void __app_task(void *p_arg){
    Wed_app_main();
}

/**
 * \brief 内核应用初始化
 *
 * @return 成功返回 0
 */
int Wed_kernel_app_init(void){
    /* 创建应用主函数 */
    int ret=  Wed_thread_init(__app_task,
                                NULL,
                               "Wed_app_main",
                                WED_APP_STACK_SIZE,
                              __g_app_stack,
                                WED_THREAD_PRIOTITY_LOWEST - 1,
                             &__g_app_thread);
    if (ret == 0) {
        WED_INFO_PRINT("APP thread init success");
    } else {
        WED_ERR_PRINT("APP thread init failed(%d)", ret);
    }
    return ret;
}

/**
 * \brief 内核调度启动
 *
 * @return 成功不返回
 */
int Wed_kernel_scheduler_start(void){
    WED_INFO_PRINT("kernel scheduler start");
#if WED_KERNEL_FREERTOS
    vTaskStartScheduler();
#endif
    WED_ERR_PRINT("kernel scheduler start failed");
    return 0;
}

/**
 * \brief 内核毫秒延时函数
 *
 * @param ms 延时的毫秒数
 */
void Wed_kernel_mdelay(uint32_t ms){
#if WED_KERNEL_FREERTOS
    vTaskDelay(pdMS_TO_TICKS(ms));
#endif
}

